{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Otto商品分类——RBF_SVM\n",
    "\n",
    "我们以Kaggle 2015年举办的Otto Group Product Classification Challenge竞赛数据为例，分别调用\n",
    "缺省参数LinearSVC、\n",
    "LinearSVC + CV进行参数调优（手动实现循环）。\n",
    "\n",
    "Otto数据集是著名电商Otto提供的一个多类商品分类问题，类别数=9. 每个样本有93维数值型特征（整数，表示某种事件发生的次数，已经进行过脱敏处理）。 竞赛官网：https://www.kaggle.com/c/otto-group-product-classification-challenge/data\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 准备数据 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10000, 48)\n"
     ]
    }
   ],
   "source": [
    "# 读取数据，只用tf_idf特征\n",
    "train = pd.read_csv(\"./Otto_FE_train_tfidf_10000_PCA.csv\")\n",
    "\n",
    "# drop ids and get labels\n",
    "y_train = train['target']   #形式为Class_x\n",
    "X_train = train.drop([\"id\", \"target\"], axis=1)\n",
    "\n",
    "\n",
    "#保存特征名字以备后用（可视化）\n",
    "feat_names = X_train.columns \n",
    "\n",
    "#sklearn的学习器大多支持稀疏数据输入，模型训练会快很多\n",
    "from scipy.sparse import csr_matrix\n",
    "X_train = csr_matrix(X_train)\n",
    "\n",
    "print(X_train.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RBF核SVM正则参数调优\n",
    "\n",
    "RBF核是SVM最常用的核函数。\n",
    "RBF核SVM 的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和核函数的宽度gamma\n",
    "C越小，决策边界越平滑； \n",
    "gamma越小，决策边界越平滑。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=3, error_score=nan,\n",
       "             estimator=SVC(C=1.0, break_ties=False, cache_size=200,\n",
       "                           class_weight=None, coef0=0.0,\n",
       "                           decision_function_shape='ovr', degree=3,\n",
       "                           gamma='scale', kernel='rbf', max_iter=-1,\n",
       "                           probability=True, random_state=None, shrinking=True,\n",
       "                           tol=0.001, verbose=False),\n",
       "             iid='deprecated', n_jobs=4,\n",
       "             param_grid={'C': array([1.e-01, 1.e+00, 1.e+01, 1.e+02, 1.e+03]),\n",
       "                         'gamma': array([ 0.1,  1. , 10. ])},\n",
       "             pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "             scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "\n",
    "Cs = np.logspace(-1, 3, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gammas = np.logspace(-1, 1, 3) \n",
    "param_rbf = {'C': Cs, 'gamma': gammas}\n",
    "\n",
    "rbf_grid = GridSearchCV(SVC(kernel='rbf',probability=True), param_rbf,cv=3, n_jobs = 4,return_train_score='warn',scoring='neg_log_loss')\n",
    "\n",
    "rbf_grid.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best score: 0.605246 using {'C': 10.0, 'gamma': 1.0}\n",
      "[[0.72147342 0.68142893 0.79379032]\n",
      " [0.67652978 0.61846614 0.71598573]\n",
      " [0.64053916 0.60524592 0.72140782]\n",
      " [0.62045944 0.6406829  0.73188031]\n",
      " [0.6462094  0.66092876 0.73141737]]\n",
      "[[0.70008421 0.63184508 0.39502609]\n",
      " [0.64687932 0.4942956  0.17037415]\n",
      " [0.57541013 0.30086117 0.09117657]\n",
      " [0.4741062  0.27296203 0.10597102]\n",
      " [0.38462933 0.29052608 0.10903073]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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VOD8/PPmQTz0xm3MzUVvsyEDAe2FSYXiHhVKCHoYjR439RUV+LwejGYzyemZGCOcuQqN3vZ3VyjiidqYpoeRYLaQmpNLckYmAZ+PgN935IsUCoXiKFHO4m6KEAJrsh2zzYYQml431FQDAqvd3mti8BUKRdejhKCbo9NpTiwpJT6PB0+DE3d9LUlpGZiUr0ChUHQCamqohyCEwN6vP47+WUgpqS49SPWhEvw+NW2kUCiODSUEnUBk9tHvy/nnn09NB3PbCyEwJ9pIz83DlppGo9uNDAaO6rnxZNeuXZxxxhmYTCYeffTRNtvt3buX008/nWHDhnHJJZfQ2HjklN0KhaLzUULQCbQnBIFA+wP1qlWrcDgc3+t5QqfDlpJKRt4gjCZtwUp9ZQXu+vpusTtaamoqTzzxBLfccku77W677TYWLlxIQUEBKSkpPPfcc8ephwqFIpJe6SPY//NftCpLmj6N1MsuI+h2U3Rt6xxA9p/8BMf//AR/dTUHf7sgqm7gS8vafV7LNNQzZszgnnvuISsriy1btrBz58420zkPGjSIjRs34nQ6mT59OpMmTeKLL74gJyeHFStWYLFYop61Z88e5s6dSyAQYPr06SxevJj6ujqqKiq4/Morqa13EpSS+++/n9mzZ7Nv3z6mTZvGpEmTWLduHaeccgpXXnkld911F+Xl5bzyyitMmDCBu+++m71791JaWsp3333H4sWLWbduHR988AE5OTmsXLkSo9HIvffey8qVK3G73fzgBz/gb3/7WyvHdWZmJpmZmeEsq7GQUvLpp5+G00xcccUV3H333Vx//fXt/q4VCkXnoyyCTuChhx5iyJAhbNmyhUWLFgFa/v37778/vPnK0qVL2bRpExs3buSJJ56gskW+F4CCggLmz5/Pjh07cDgc4bTSkSxYsIAFCxawYcOGcNI2odORnT+EN994g09WruD1559j4Y034g+Fne7evZsFCxawdetWdu3axauvvsrnn3/Oo48+ygMPPBC+9549e3j//fdZsWIFl19+OVOmTGHbtm1YLJbwoH7DDTewYcMGtm/fjtvt5r33tIRYS5YsYcmSJR3+nVVWVuJwODAYtHeR3NxcDh482OHrFQpF59ErLYL23uB1Fku79YaUlCNaAB1hwoQJ4fTRQJvpnCMZPHgwY8aMAeC0005j3759re67du1a3nnnHQAu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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "### 最佳超参数\n",
    "print(\"Best score: %f using %s\" % (-rbf_grid.best_score_, rbf_grid.best_params_))\n",
    "\n",
    "# plot CV误差曲线\n",
    "rbf_test_means = -rbf_grid.cv_results_[ 'mean_test_score' ]\n",
    "rbf_train_means = -rbf_grid.cv_results_[ 'mean_train_score' ]\n",
    "\n",
    "n_Cs = len(Cs)\n",
    "number_gamms = len(gammas)\n",
    "\n",
    "\n",
    "rbf_test_scores =  np.array(rbf_test_means).reshape(n_Cs,number_gamms)\n",
    "rbf_train_scores = np.array(rbf_train_means).reshape(n_Cs,number_gamms)\n",
    "\n",
    "# plot results\n",
    "print(rbf_test_scores)\n",
    "print(rbf_train_scores)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(gammas):\n",
    "    plt.plot(x_axis, rbf_test_scores[:,i], label= 'test gamma:'+ str(gammas[i]))\n",
    "    plt.plot(x_axis, rbf_train_scores[:,i], label=  'train gamma:'+str(gammas[i]),linestyle='dashed')\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'Logloss' )\n",
    "plt.ylim(0, 1.1)\n",
    "\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
